package 剑指offer.数组;

/**
 * 给定一串数字：01234567891011121314151617
 * 第 0 位数字是 0
 * 第 5 位数字是 5
 * 第 19 位数字是 4
 */
public class 第44题数字序列中某一位的数字 {

    /**
     * 数字序列是从 0 到 +∞
     * 假设以下的 n = 1001
     * @param n 求第 n 位的数字。n 从 0 开始
     * @return
     */
    public static int getNumAtIndex(int n) {
        int ans = -1;
        if (n < 0)
            return ans;
        if (n < 10)
            return n;
        // 1.先确定 n 1001 位指的数在什么范围内（个十百千？）
        int tmpN = 10;
        int step = 90;
        int i = 2;
        for (; i < Integer.MAX_VALUE; i++) {
            // 若当前数的位数没有达到 n 位，就继续数
            if (tmpN < n) {
                tmpN = tmpN + i * step;
                step *= 10;
            } else {
                break;
            }
        }
        // i = 3
        // 2. 现在确定了 n 1001 的范围在一个三位数里面
        // 现在要从100开始数（1001-190）=811次就可以了
        // 那么这811次里面有几个三位数呢？
        // 811 = 3 * 270 + 1，也就是有 270 个三位数
        // 答案显而易见：100 + 270 = 370 然后再往后数一位 ：7
        int start = (int) Math.pow(10, i - 1);
        int remindBit = n - (tmpN - i * (step / 10));
        int x = remindBit / i; // 270
        int y = remindBit % i; // 1
        start += x;
        // 还要往后数 y 位
        String num = String.valueOf(start);
        ans = Integer.valueOf(String.valueOf(num.charAt(y)));
        return ans;
    }

    public static void main(String[] args) {
        System.out.println(getNumAtIndex(1001));
    }

    public static int getNumAtIndex2(int n) {
        if (n < 0)
            return -1;
        if (n >= 0 && n < 10) {
            return n;
        }
        return 0;
    }
}
